home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 3 / Cream of the Crop 3.iso / comm / wnos5src.zip / TCPCMD.C < prev    next >
Text File  |  1993-08-09  |  6KB  |  260 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "timer.h"
  4. #include "mbuf.h"
  5. #include "netuser.h"
  6. #include "internet.h"
  7. #include "tcp.h"
  8. #include "cmdparse.h"
  9. #include "commands.h"
  10.  
  11. /* Close a TCP connection */
  12. static int
  13. dotcpclose(int argc,char **argv,void *p)
  14. {
  15.     struct tcb *tcb = (struct tcb *)shtop(argv[1]);
  16.  
  17.     if(close_tcp(tcb) == -1) {
  18.         tputs(Notval);
  19.         return -1;
  20.     }
  21.     return 0;
  22. }
  23.  
  24. /* Set initial round trip time for new connections */
  25. static int
  26. doirtt(int argc,char **argv,void *p)
  27. {
  28.     setlong(&Tcp_irtt,"TCP irtt",argc,argv);
  29.  
  30.     if(argc < 2){
  31.       struct tcp_rtt *tp;
  32.  
  33.       for(tp = &Tcp_rtt[0]; tp < &Tcp_rtt[RTTCACHE]; tp++) {
  34.         if(tp->addr != 0) {
  35.           tprintf("%s: srtt %ld mdev %ld\n",
  36.             inet_ntoa(tp->addr),tp->srtt,tp->mdev);
  37.         }
  38.       }
  39.     }
  40.     return 0;
  41. }
  42.  
  43. /* Force a retransmission */
  44. static int
  45. dotcpkick(int argc,char **argv,void *p)
  46. {
  47.     struct tcb *tcb = (struct tcb *)shtop(argv[1]);
  48.  
  49.     if(kick_tcp(tcb) == -1) {
  50.         tputs(Notval);
  51.         return 1;
  52.     }
  53.     return 0;
  54. }
  55.  
  56. /* Set default maximum segment size */
  57. static int
  58. domss(int argc,char **argv,void *p)
  59. {
  60.     return setshort(&Tcp_mss,"TCP MSS",argc,argv);
  61. }
  62.  
  63. /* Eliminate a TCP connection */
  64. static int
  65. dotcpreset(int argc,char **argv,void *p)
  66. {
  67.     struct tcb *tcb = (struct tcb *)shtop(argv[1]);
  68.  
  69.     if(!tcpval(tcb)){
  70.         tputs(Notval);
  71.         return 1;
  72.     }
  73.     close_self(tcb,RESET);
  74.     return 0;
  75. }
  76.  
  77. static int
  78. dotcpretry(int argc,char **argv,void *p)
  79. {
  80.     return setint(&Tcp_retry,"TCP retry",argc,argv);
  81. }
  82.  
  83. /* Set smoothed round trip time for specified TCB */
  84. static int
  85. dortt(int argc,char **argv,void *p)
  86. {
  87.     struct tcb *tcb = (struct tcb *)shtop(argv[1]);
  88.  
  89.     if(!tcpval(tcb)){
  90.         tputs(Notval);
  91.         return 1;
  92.     }
  93.     tcb->srtt = atol(argv[2]);
  94.     return 0;
  95. }
  96.  
  97. /* Display status of TCBs */
  98. static int
  99. dotcpstat(int argc,char **argv,void *p)
  100. {
  101.   if(argc < 2) {
  102.   /* Dump TCP stats and summary of all TCBs
  103.   /*     &TCB Rcv-Q Snd-Q  Local socket           Remote socket          State
  104.    *     1234     0     0  xxx.xxx.xxx.xxx:xxxxx  xxx.xxx.xxx.xxx:xxxxx  Established
  105.    */
  106.     int i, j;
  107.     struct tcb *tcb;
  108.  
  109.     for(j = i = 1; i <= NUMTCPMIB; i++) {
  110.       if(Tcp_mib[i].name == NULLCHAR)
  111.         continue;
  112.       tprintf("(%2u)tcp%-17s%10lu",i,Tcp_mib[i].name,Tcp_mib[i].value.integer);
  113.       tputs((j++ % 2) ? "     " : "\n");
  114.     }
  115.     if((j % 2) == 0)
  116.       tputs("\n");
  117.  
  118.     tputs("&TCB Rcv-Q Snd-Q  Local socket           Remote socket          State\n");
  119.  
  120.     for(tcb = Tcbs; tcb != NULLTCB; tcb = tcb->next){
  121.       tprintf("%lx%6u%6u  %-23s",
  122.         ptol(tcb),tcb->rcvcnt,tcb->sndcnt,pinet(&tcb->conn.local));
  123.       tprintf("%-23s%-s",pinet(&tcb->conn.remote),Tcpstates[tcb->state]);
  124.       if(tcb->state == TCP_LISTEN && tcb->flags.clone)
  125.         tputs(" (S)");
  126.       tputs("\n");
  127.     }
  128.   } else {
  129.     struct tcb *tcb = (struct tcb *)shtop(argv[1]);
  130.     if(tcpval(tcb)) {
  131.       st_tcp(tcb);
  132.     } else {
  133.       tputs(Notval);
  134.     }
  135.   }
  136.   return 0;
  137. }
  138.  
  139. static int
  140. dosyndata(int argc,char **argv,void *p)
  141. {
  142.     return setbool(&Tcp_syndata,"TCP syn+data piggybacking",argc,argv);
  143. }
  144.  
  145. static int
  146. dotcptr(int argc,char **argv,void *p)
  147. {
  148.     return setbool(&Tcp_trace,"TCP trace",argc,argv);
  149. }
  150.  
  151. /* Set default window size */
  152. static int
  153. dowindow(int argc,char **argv,void *p)
  154. {
  155.     return setshort(&Tcp_window,"TCP window",argc,argv);
  156. }
  157.  
  158. /* Dump a TCP control block in detail */
  159. void
  160. st_tcp(struct tcb *tcb)
  161. {
  162.     /* Compute total data sent and received; take out SYN and FIN */
  163.     int32 sent = tcb->snd.una - tcb->iss;    /* Acknowledged data only */
  164.     int32 recvd = tcb->rcv.nxt - tcb->irs;
  165.  
  166.     if(tcb == NULLTCB)
  167.         return;
  168.  
  169.     switch(tcb->state){
  170.     case TCP_LISTEN:
  171.     case TCP_SYN_SENT:    /* Nothing received or acked yet */
  172.         sent = recvd = 0;
  173.         break;
  174.     case TCP_SYN_RECEIVED:
  175.         recvd--;    /* Got SYN, no data acked yet */
  176.         sent = 0;
  177.         break;
  178.     case TCP_ESTABLISHED:    /* Got and sent SYN */
  179.     case TCP_FINWAIT1:    /* FIN not acked yet */
  180.         sent--;
  181.         recvd--;
  182.         break;
  183.     case TCP_FINWAIT2:    /* Our SYN and FIN both acked */
  184.         sent -= 2;
  185.         recvd--;
  186.         break;
  187.     case TCP_CLOSE_WAIT:    /* Got SYN and FIN, our FIN not yet acked */
  188.     case TCP_CLOSING:
  189.     case TCP_LAST_ACK:
  190.         sent--;
  191.         recvd -= 2;
  192.         break;
  193.     case TCP_TIME_WAIT:    /* Sent and received SYN/FIN, all acked */
  194.         sent -= 2;
  195.         recvd -= 2;
  196.         break;
  197.     }
  198.     tprintf("Local %s",pinet(&tcb->conn.local));
  199.     tprintf(" Remote %s State: %s\n      Init seq    Unack     Next Resent "
  200.             "CWind Thrsh  Wind  MSS Queue      Total\n",
  201.         pinet(&tcb->conn.remote),
  202.         Tcpstates[tcb->state]);
  203.     tprintf("Send:%9lx%9lx%9lx",tcb->iss,tcb->snd.una,tcb->snd.nxt);
  204.     tprintf("%7lu%6u%6u",tcb->resent,tcb->cwind,tcb->ssthresh);
  205.     tprintf("%6u%5u%6u%11lu\n",tcb->snd.wnd,tcb->mss,tcb->sndcnt,sent);
  206.  
  207.     tprintf("Recv:%9lx%18lx%7lu",tcb->irs,tcb->rcv.nxt,tcb->rerecv);
  208.     tprintf("%18u%11u%11lu\n",tcb->rcv.wnd,tcb->rcvcnt,recvd);
  209.  
  210.     if(tcb->backoff > 0)
  211.         tprintf("Backoff %u ",tcb->backoff);
  212.     if(tcb->flags.retran)
  213.         tputs("Retrying ");
  214.     tputs("Timer ");
  215.     switch(tcb->timer.state){
  216.     case TIMER_STOP:
  217.         tputs("-");
  218.         break;
  219.     case TIMER_RUN:
  220.         tprintf("%lu",read_timer(&tcb->timer));
  221.         break;
  222.     case TIMER_EXPIRE:
  223.         tputs("E");
  224.         break;
  225.     }
  226.  
  227.     tprintf("/%lu ms SRTT %ld ms Mean dev %ld ms\n",
  228.         dur_timer(&tcb->timer),tcb->srtt,tcb->mdev);
  229.  
  230.     if(tcb->reseq != NULLRESEQ) {
  231.         struct reseq *rp;
  232.  
  233.         tputs("Reassembly queue:\n");
  234.         for(rp = tcb->reseq; rp != NULLRESEQ; rp = rp->next) {
  235.             tprintf("  seq x%lx %u bytes\n",rp->seg.seq,rp->length);
  236.         }
  237.     }
  238. }
  239.  
  240. /* TCP subcommand table */
  241. int
  242. dotcp(int argc,char **argv,void *p)
  243. {
  244.     struct cmds Tcpcmds[] = {
  245.         "close",    dotcpclose,     0, 2,    "tcp close <tcb>",
  246.         "irtt",        doirtt,            0, 0,    NULLCHAR,
  247.         "kick",        dotcpkick,        0, 2,    "tcp kick <tcb>",
  248.         "mss",        domss,            0, 0,    NULLCHAR,
  249.         "reset",    dotcpreset,        0, 2,    "tcp reset <tcb>",
  250.         "retry",    dotcpretry,     0, 0,    NULLCHAR,
  251.         "rtt",        dortt,            0, 3,    "tcp rtt <tcb> <val>",
  252.         "status",    dotcpstat,        0, 0,    NULLCHAR,
  253.         "syndata",    dosyndata,       0, 0,     NULLCHAR,
  254.         "trace",    dotcptr,        0, 0,    NULLCHAR,
  255.         "window",    dowindow,        0, 0,    NULLCHAR,
  256.         NULLCHAR,
  257.     };
  258.     return subcmd(Tcpcmds,argc,argv,p);
  259. }
  260.